﻿using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System;
using System.Linq.Expressions;

namespace Sudoku.Game
{
    /// <summary>
    /// Класс положения на поле
    /// </summary>
	public class FieldState
	{
        /// <summary>
        /// Игровое поле в виде массива ячеек
        /// </summary>
        private Cell[,] _field;
        /// <summary>
        /// конструктор, пустой, выделяет память под новое поле
        /// </summary>
		public FieldState()
		{
			_field = new Cell[9,9];
		}
        /// <summary>
        /// конструктор, создающий поле по готовому массиву
        /// </summary>
        /// <param name="field"></param>
		internal FieldState(Cell[,] field)
		{
			_field = field;
		}
        /// <summary>
        /// Конструктор для поля по значениям ячеек
        /// </summary>
        /// <param name="field"></param>
        internal FieldState(int[,] field)
        {
			_field = new Cell[9, 9];
            ///алгоритм для расположения значений из целочисленного массива
        	for (int i = 0; i < 9; i++)
        		for (int j = 0; j < 9; j++)
        		{
        			_field[i, j] = new Cell(field[i,j],true);
        		}
        }
        /// <summary>
        /// экземплячр класса Поле
        /// </summary>
		public Cell[,] Field
		{
			get { return _field; }
			internal set { _field = value; }
		}
        /// <summary>
        /// экземпляр целочисленного массива со значениями
        /// </summary>
	    public int[,] Values
	    {
            get
            {
                var res = new int[9,9];
                for (int i = 0; i < _field.GetLength(0); i++)
                    for (int j = 0; j < _field.GetLength(1); j++)
                    {
                        res[i, j] = _field[0, 1].Value;
                    }
                return res;
            }
	    }
        /// <summary>
        /// получает значения ячеек
        /// </summary>
        /// <param name="horizontal"></param>
        /// <param name="vertical"></param>
        /// <returns></returns>
        public Cell GetCell(int horizontal, int vertical)
		{
			return _field[vertical,horizontal];
		}
        /// <summary>
        /// устанавливает значения ячеек
        /// </summary>
        /// <param name="horizontal"></param>
        /// <param name="vertical"></param>
        /// <param name="value"></param>
        internal void SetCell(int horizontal, int vertical, Cell value)
        {
            _field[vertical, horizontal] = value;
        }

        /// <summary>
        /// сравнение значений
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public override bool Equals(object obj)
        {
            for (int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 9; j++)
                {
                    if (_field[i, j] == null || obj == null || _field[i, j].Value != (obj as FieldState).Field[i,j].Value)
                        return false;
                }
            }

            return true;
        }
        /// <summary>
        /// алгоритм для выбора ячейки, в которую заносится значение
        /// </summary>
        /// <returns></returns>
		public FieldState CloneState()
		{
			var result = new FieldState();

			for (int i = 0; i < 9; i++)
				for (int j = 0; j < 9; j++)
				{
					result.Field[i, j] = _field[i, j].Clone();
				}

			return result;
		}
	}
}
